#include "LZ_HX711.h"
static u8 maopi_flag=0;
static long maopi;
static float get_new_weight;
//24位adc换算比例
// sck要求拉低,如果拉高60us传感器就会断电,只在需要时才短暂拉高5us进行串口通信
//用于手动模拟串口通信,sck时钟的延时
void Delay5us(void)	//@24.000MHz
{
	unsigned char data i;
	i = 38;
	while (--i);
}
//传感器读24位adc数据,用串口接收,手动模拟串口通信
long stress_sensor_read_data(){
    u32 count;
    u8 i;
    HX711_SCK=0;
    count=0;
    //防止中断干扰传感器延时判断
    EA=0;
    while(HX711_DOUT);
    EA=1;
    for(i=0;i<24;i++){
        HX711_SCK=1;
        Delay5us();
        count=count<<1;
        HX711_SCK=0;
        Delay5us();
        if(HX711_DOUT)count++;
    }
    HX711_SCK=1;
    Delay5us();
    count=count^0x800000;//生成24位补码
    HX711_SCK=0;
    return (long)count;
}
//中值滤波算法
long median_filter(long samples[], int size) {
    long i,j,temp,mid1,mid2;//mid3;
    // 冒泡排序（升序）
    for (i = 0; i < size-1; i++) {
        for (j = 0; j < size-i-1; j++) {
            if (samples[j] > samples[j+1]) {
                // 交换元素
                temp = samples[j];
                samples[j] = samples[j+1];
                samples[j+1] = temp;
            }
        }
    }
    // 取中间两个值索引
    mid1 = samples[size/2 - 1]; // 第5个元素（索引4）
    mid2 = samples[size/2];     // 第6个元素（索引5）
    // mid3 = samples[size/2+1];
    // 计算平均值
    // return (mid1 + mid2+mid3) / 3;
    return (mid1 + mid2) / 2;
}
//获得中值滤波生成的标准adc值
long get_adc_sub_value(){
    u8 i=0;
     long result=0;
  	 long weights[FILTER_COUNT_HZ]={0};
    for(i=0;i<FILTER_COUNT_HZ;i++){
        weights[i]=stress_sensor_read_data();
        // delay_ms(20);
        os_wait2(K_TMO,4);
    }
    result=median_filter(weights,FILTER_COUNT_HZ);
    // result=stress_sensor_read_data();
    return result;
}
//初始重量校准,必须得到计算
long set_maopi(){
    // maopi=10;// get_adc_sub_value();
    maopi= get_adc_sub_value();
    maopi_flag=1;
    return maopi;
}
//获得重量,进行换算
float get_weight(){
	long temp_adc;
    //说明还没有进行原始称重,不能进行重量换算
    if(maopi_flag==0){
        return -1000;
    }
    // temp_adc= get_adc_sub_value();
    temp_adc=10; //get_adc_sub_value();
    temp_adc=get_adc_sub_value();
    temp_adc=maopi-temp_adc;
    //保留三位小数*1000,获得后三位,用整型截断,然后/1000.0
    //算了,直接输出原始重量
    get_new_weight=(float)temp_adc/(GapValue);
    //校准负值波动-0.2范围内为0
    if((get_new_weight<0 && get_new_weight>-0.5) || (get_new_weight>0 && get_new_weight<0.5)){
        get_new_weight=0;
    }
    return get_new_weight;
}
//上电自动做空盘校准,不能放东西
void stress_sensor_init(){
    GPIO_InitTypeDef init;
    init.Mode=GPIO_OUT_PP;
    init.Pin=GPIO_Pin_0;
    GPIO_Inilize(GPIO_P2,&init);

    init.Mode=GPIO_HighZ;
    init.Pin=GPIO_Pin_1;
    GPIO_Inilize(GPIO_P2,&init);
    HX711_SCK=0;
     //等压力传感器稳定,获得空状态毛皮重量
    //  lzdelay_ms(10);
    os_wait2(K_TMO,2);
     maopi=set_maopi();
     os_wait2(K_TMO,2);
    //  lzdelay_ms(10);
}